home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
tie
/
src
/
edit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
46KB
|
1,595 lines
/*
* TMENU.INF Editor 内容編集画面
*/
#include "config.h"
#include "edit.h"
#define ICON_X 32 /* アイテム・アイコン表示位置 */
#define DT_X 88 /* 編集モードのデータ表示位置 */
#define MAX_DSP 5 /* 一度に画面に表示できる数 */
#define item_y(y) ((y)*ITEM_Y_SIZ+ITEM_Y)
typedef struct /* メニューを移動したときの位置情報を渡すための構造体 */
{
int xpos, ypos ; /* 開始位置 */
int xsiz, ysiz ; /* 大きさ */
char *ttl ; /* タイトル文字列へのポインタ */
int ttlx, ttly ; /* タイトル開始位置 */
int ttllen ; /* タイトル文字数 */
char *btn[MAX_BTN_MSG] ; /* ボタンの文字列 */
int btnx[MAX_BTN_MSG] ; /* ボタンの位置 */
int btny[MAX_BTN_MSG] ; /* ボタンの位置 */
int btnlen ; /* ボタンの文字数 */
int btnnum, btnxsiz ; /* ボタンの数と大きさ */
char *sw[MAX_SW_MSG] ; /* スイッチの文字列 */
int swx[MAX_SW_MSG] ; /* スイッチの位置 */
int swy[MAX_SW_MSG] ; /* スイッチの位置 */
int swxsiz[MAX_SW_MSG] ; /* スイッチの大きさ */
int swysiz[MAX_SW_MSG] ; /* スイッチの大きさ */
int swlen ; /* スイッチの文字数 */
int swnum ; /* スイッチの数 */
char *msg[MAX_DSP_MSG] ; /* メッセージ文字列 */
int msgnum, msglen ; /* メッセージ文字列の数と文字数 */
int (*func)(void) ; /* 画面再描画ルーチンへのポインタ */
} MENU_PRM ;
static MENU_PRM mprm = { 0,0 } ;
static int pos = 0 ;
static int vol_size = 0 ;
static int menu_event = 0 ;
static int curpos = 0 ;
static int curlin = 0 ;
extern void dsp_menu( char *file ) ;
extern int dsp_scrn( int num, int rewrite ) ;
extern void dsp_icon( int num, INF *ip, int clear ) ;
extern void dsp_bar( int num ) ;
extern void del_item( int num ) ; /* アイテム削除 */
extern void dsp_dirmode( int num, INF *ip ) ;
extern void TEXT_clip( REGS EVENT *ep, int x, int y, int sw ) ;
extern void MOVE_clip( REGS EVENT *ep, int x, int y, int sw ) ;
extern void ITEM_clip( REGS EVENT *ep, int x, int y, int sw ) ;
extern void MENU_clip( REGS EVENT *ep, int x, int y, int sw ) ;
extern void ROLL_clip( REGS EVENT *ep, int x, int y, int sw ) ;
extern void click_item( int num ) ; /* アイテムクリック */
extern void click_text( int num ) ; /* テキストクリック */
extern int select_icon( u_char *icon_name, u_char *icon_text ) ;
const char init_data[] = /* TMENU.INFの1レコード分の初期化データ */
{
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x00,0x00,0x07,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
} ;
char *get_dirmode( int flag )
{
if( flag == 0x10 ) /* ディレクトリモード */
return " 移 動 " ;
else
return " 実 行 " ;
}
int chg_dirmode( int flag )
{
return ( flag == 0x10 ) ? 0x00 : 0x10 ;
}
static void set_filename( INF *ip, char *path )
{
auto int i ;
auto char *p ;
/* ファイル名の先頭を確認 */
if( ( p = strrchr( path, '\\' ) ) == NULL )
p = path ;
else
p ++ ;
/* ファイル名を整形してコピー */
for( i = 0 ; i < 8 && ( *p != ' ' && *p != '.' && *p != '\0' ) ; i ++ )
ip->fname[i] = *p++ ;
for( ; i < IR_FNAMLEN ; i ++ )
ip->fname[i] = ' ' ;
ip->dot = ( *p == '.' ) ? '.' : ' ' ;
if( *p++ != '\0' ) /* 拡張子があるときはコピー */
for( i = 0 ; i < IR_FEXTLEN && *p != '\0' ; i ++ )
ip->fext[i] = *p++ ;
else
i = 0 ;
for( ; i < IR_FEXTLEN ; i ++ ) /* あまりは空白を詰める */
ip->fext[i] = ' ' ;
}
void init_inf( INF *ip, char *path, char *title, int icon_num )
{
auto char *p ;
auto char buf[ 256 ] ;
#if 0
/* 初期化 全領域をNULLで初期化し、必要なところだけスペースをつめる */
for( i = 0, p = (char *)ip ; i < sizeof( INF ) ; i ++ )
*p++ = '\0' ;
for( i = 0, p = (char *)ip->space ; i < 21+13+IR_CMDLEN ; i ++ )
*p++ = ' ' ;
#else
/* 標準初期化データで初期化する */
memcpy( ip, init_data, sizeof( INF ) ) ;
#endif
/* パラメータを分離したパスリストを生成 */
strncpy( buf, path, 256 ) ;
for( p = buf ; *p != '\0' && *p != ' ' ; p ++ ) ;
*p = '\0' ;
/* パラメータつきパスリストをセット */
strncpy( (char *)ip->cmd, path, IR_CMDLEN ) ;
ip->cmd[IR_CMDLEN-1] = '\0' ;
trim( ip->cmd ) ; /* 行末のスペースは削除 */
/* アイテム名の指定があれば、セット */
if( title != NULL )
strncpy( (char *)ip->name, title, 13 ) ;
else
{
if( ( p = strrchr( buf, '\\' ) ) == NULL )
p = buf ;
if( *p != '\0' )
p ++ ;
strncpy( (char *)ip->name, p, 13 ) ;
ip->name[12] = '\0' ;
}
/* アイコン番号の指定があればセット */
if( icon_num < 0 || icon_num > 127 )
ip->icon_num = '\007' ; /* デフォルト・アイコン */
else
ip->icon_num = icon_num ; /* 指定のアイコン */
/* ファイル名をセット */
set_filename( ip, buf ) ;
}
void refresh_inf( INF *ip )
{
auto INF tmp ;
init_inf( &tmp, (char *)ip->cmd, (char *)ip->name, ip->icon_num ) ;
tmp.dirflag = ip->dirflag ;
memcpy( ip, &tmp, sizeof( INF ) ) ;
}
int edit_text( char file[] )
{
int num = 0, rewrite = TRUE ;
int ch ;
int ret_val = RET_DEFAULT ;
char *tmpfile ;
MOS_disp( mos_disp = MOS_OFF ) ;
EVT_reset() ;
dsp_menu( file ) ; /* 一番上の行などなど */
MOS_disp( mos_disp = MOS_ON ) ;
keyflush() ;
curpos = 0 ;
if( curlin/2+pos >= maxnum )
curlin = ( maxnum - pos ) * 2 - 1 ;
do
{
dsp_scrn( num, rewrite ) ;
rewrite = FALSE ;
click_text( curlin ) ;
do
{
menu_event = 0 ;
EVT_loop( 0,3 ) ;
if( kbhit( ON ) != FALSE ) /* キー入力センス */
{
switch( ch = getch() )
{
case 0x807C: /* BREAK : 読み込み */
menu_event = 15 ; break ;
case 0x807D: /* COPY : 新規 */
menu_event = 4 ; break ;
case 0x8066: /* PF10 : 終了 */
menu_event = 1 ; break ;
case 0x8069: /* PF11 : 読み込み */
menu_event = 2 ; break ;
case 0x805B: /* PF12 : 書き込み */
menu_event = 3 ; break ;
case 0x806E: /* 前行 */
dsp_scrn( pos-1, FALSE ) ;
click_text( curlin ) ;
break ;
case 0x8070: /* 次行 */
dsp_scrn( pos+1, FALSE ) ;
click_text( curlin ) ;
break ;
case '\x1E': /* 上矢印 */
case '\x05': /* ^E */
if( -- curlin < 0 )
curlin += ( dsp_scrn( pos-1, FALSE ) == TRUE ) ? 2:1 ;
click_text( curlin ) ;
break ;
case '\x0D': /* 改行 */
case 0x8073: /* 実行 */
curpos = 0 ;
case '\x1F': /* 下矢印 */
case '\x18': /* ^X */
if( ++ curlin > MAX_DSP*2-1 || curlin/2+pos >= maxnum )
curlin -= ( dsp_scrn( pos+1, FALSE ) == TRUE ) ? 2:1 ;
click_text( curlin ) ;
break ;
case '\x1B': /* ESC は無視 */
break ;
default:
putch( ch ) ;
}
}
switch( menu_event )
{
case 1: /* 終了 */
wind_close() ;
if( end_assert( file ) == TRUE )
ret_val = RET_QUIT ;
else
{
menu_event = 0 ;
click_text( curlin ) ;
title( file ) ;
}
break ;
case 2: /* 読み込み */
wind_close() ;
if( ( tmpfile = load_file() ) == NULL )
menu_event = 0 ;
else
{
if( *tmpfile == '\0' )
maxnum = 0 ;
strcpy( file, tmpfile ) ;
rewrite = TRUE ;
num = pos = 0 ;
title( file ) ;
}
click_text( curlin ) ;
break ;
case 3: /* 書き込み */
wind_close() ;
if( ( tmpfile = save_file( file ) ) == NULL )
menu_event = 0 ;
else
{
strcpy( file, tmpfile ) ;
title( file ) ;
}
click_text( curlin ) ;
break ;
case 4: /* 新規登録 */
wind_close() ;
if( ( tmpfile = select_file( NULL, 'N' ) ) == NULL )
menu_event = 0 ;
else
{
int dirmode = 0 ;
dirmode = sep_dirmode( tmpfile ) ;
init_inf( &inf[maxnum], tmpfile, NULL,-1 ) ;
inf[maxnum].dirflag = dirmode ;
if( edit_item( &inf[maxnum] ) == FALSE ) /* 中止 */
menu_event = 0 ;
else
{
maxnum ++ ;
num = maxnum ;
rewrite = TRUE ;
}
}
click_text( curlin ) ;
break ;
case 10: /* ↑ */
num = pos - 1 ;
break ;
case 11: /* ↓ */
num = pos + 1 ;
break ;
case 12: /* バッファの切り換え */
if( ( tmpfile = change_buf( file ) ) != NULL )
{
strcpy( file, tmpfile ) ;
title( file ) ;
rewrite = TRUE ;
}
break ;
case 15: /* 移動モードへ切り換え */
wind_close() ;
ret_val = RET_MODE ;
break ;
case 100: /* 再表示 */
num = pos ;
rewrite = TRUE ;
break ;
default:
if( menu_event >= 20 && menu_event < 20+MAX_DSP )
{
wind_close() ;
click_item( menu_event - 20 ) ;
menu_event = 0 ;
click_text( curlin ) ;
}
if( menu_event >= 30 && menu_event < 30+MAX_DSP*2 )
{
click_text( curlin = menu_event - 30 ) ;
menu_event = 0 ;
}
if( menu_event >= 50 && menu_event < 50+MAX_DSP )
{
wind_close() ;
del_item( menu_event - 50 ) ;
menu_event = 0 ;
click_text( curlin ) ;
}
if( menu_event >= 60 && menu_event < 60+MAX_DSP )
{
int inum = pos + menu_event - 60 ;
inf[inum].dirflag = chg_dirmode( inf[inum].dirflag ) ;
MOS_disp( MOS_OFF ) ;
dsp_dirmode( menu_event-60, &inf[inum] ) ;
MOS_disp( MOS_ON ) ;
menu_event = 0 ;
}
}
} while( menu_event == 0 ) ;
} while( ret_val == RET_DEFAULT ) ;
return( ret_val ) ;
}
static void click_item( int num ) /* アイテムクリック */
{
int inum, y ;
/* アイコン変更 */
if( ( inum = select_icon( inf[num+pos].name, inf[num+pos].cmd ) ) == -1 )
return ;
inf[ num + pos ].icon_num = inum ;
y = item_y( num )+8 ;
dsp_box( ICON_X,y, ICON_X+31,y+31, 15,15,15 ) ;
dsp_ptn( ICON_X,y, (char *)&icon[ inum ], 1 ) ;
}
static void click_text( int num ) /* テキストクリック */
{
int inum = pos + num / 2 ;
int y = item_y( num / 2 ) ;
if( inum >= maxnum )
return ;
if( ( num % 2 ) == 0 )
wind_open( DT_X+2,y+2, 12,&curpos, 0,15,5, (char *)inf[inum].name ) ;
else
wind_open( DT_X+2,y+28, 63,&curpos, 0,15,5, (char *)inf[inum].cmd ) ;
}
static void del_item( int num ) /* アイテム削除 */
{
int inum = pos + num ;
char tmp[64] ;
chg_palette( 0, now_palet = 1 ) ;
sprintf( tmp, "「%s」を削除します", inf[inum].name ) ;
msg[0] = tmp ;
msg[1] = NULL ;
if( select_mode( msg_kakunin, msg, msg_btn2 ) == 0 )
{
del_inf( inum ) ;
dsp_scrn( pos, TRUE ) ;
if( curlin/2+pos+1 > maxnum )
curlin = ( maxnum - pos ) * 2 - 1 ;
}
chg_palette( 0, now_palet = 0 ) ;
}
static void dsp_menu( char *file )
{
int i, y ;
dsp_menu2( file, MENU_clip, MOVE_clip ) ; /* 編集/移動 共通部分 */
dsp_ptn( MD_X+1,MD_Y+1, ptn_edit, 0 ) ;
for( i = 0 ; i < MAX_DSP ; i ++ )
{
y = item_y( i ) ;
EVT_set_node( ICON_X-1,y+8-1, ICON_X+32,y+8+32,
1, ITEM_clip, 20+i, FALSE ) ;
EVT_set_node( DT_X,y, DT_X+8*12+2,y+19,
1, TEXT_clip, 30+i*2, FALSE ) ;
EVT_set_node( DT_X,y+26, DT_X+8*63+2,y+45,
1, TEXT_clip, 31+i*2, FALSE ) ;
EVT_set_node( DT_X+8*55+5,y, DT_X+8*63+2,y+19,
1, MENU_clip, 50+i, FALSE ) ;
EVT_set_node( DT_X+8*45+5,y, DT_X+8*53+2,y+19,
1, MENU_clip, 60+i, FALSE ) ;
}
}
/* アイテムを表示する */
static int dsp_scrn( int num, int rewrite )
{
int i, dif ;
int st, ed ;
static struct
{
short x1, y1, x2, y2 ;
} para = { SCR_X1,SCR_Y1, SCR_X2,SCR_Y2 } ;
wind_close() ; /* 再表示したら入力は終了 */
if( num + MAX_DSP > maxnum )
num = maxnum - MAX_DSP ;
if( num < 0 )
num = 0 ;
if( rewrite != TRUE && ( dif = pos - num ) == 0 )
{
MOS_disp( mos_disp ) ;
return FALSE ;
}
MOS_disp( MOS_OFF ) ;
EGB_color( egbwork, 1, 15 ) ;
if( rewrite == TRUE || abs( dif ) > 3 ) /* 再表示 */
{
dsp_box( SCR_X1,SCR_Y1, SCR_X2,SCR_Y2, 15,15,15 ) ;
st = 0 ; ed = ( maxnum-num > MAX_DSP ) ? MAX_DSP : (maxnum-num) ;
}
else if( dif < 0 )
{
EGB_partScroll( egbwork, 1, 0, ITEM_Y_SIZ*dif, (char *)¶ ) ;
st = MAX_DSP+dif ; ed = MAX_DSP ;
}
else if( dif > 0 )
{
EGB_partScroll( egbwork, 1, 0, ITEM_Y_SIZ*dif, (char *)¶ ) ;
st = 0 ; ed = dif ;
}
else
st = 0, ed = 0 ;
pos = num ;
for( i = st ; i+num < maxnum && i < ed ; i ++ )
dsp_icon( i, &inf[i+num], FALSE ) ;
dsp_bar( num ) ;
MOS_disp( mos_disp ) ;
return TRUE ;
}
static void dsp_dirmode( int num, INF *ip )
{
int y = item_y( num ) ;
dsp_box( DT_X+8*45+7,y+2, DT_X+8*53+2+1,y+19+1, 1,1,1 ) ;
dsp_box( DT_X+8*45+5,y, DT_X+8*53+2, y+19, 1,1,15 ) ;
wrt( get_dirmode( ip->dirflag ), writepage,
DT_X+8*45+8,y+2, COL_1,COL_15, 16 ) ;
}
/* アイテム1個を表示する */
static void dsp_icon( int num, INF *ip, int clear )
{
int y ;
y = item_y( num ) ;
if( clear == TRUE )
dsp_box( SCR_X1,y, SCR_X2,y+48, 15,15,15 ) ;
dsp_ptn( ICON_X,y+8, (char *)&icon[ ip->icon_num ], 1 ) ;
ip->name[12] = '\0' ;
wrt( (char *)ip->name, writepage, DT_X+2,y+2, COL_1,BAK_COL, 16 ) ;
box( DT_X,y, DT_X+8*12+2,y+19, 0, -1, 0 ) ;
ip->cmd[63] = '\0' ;
wrt( (char *)ip->cmd, writepage, DT_X+2,y+28, COL_1,BAK_COL, 16 ) ;
box( DT_X,y+26, DT_X+8*63+2,y+45, 0,-1,0 ) ;
dsp_dirmode( num, ip ) ;
dsp_box( DT_X+8*55+7,y+2, DT_X+8*63+2+1,y+19+1, 1,1,1 ) ;
dsp_box( DT_X+8*55+5,y, DT_X+8*63+2, y+19, 1,1,15 ) ;
wrt( " 削 除 ", writepage, DT_X+8*55+8,y+2, COL_1,COL_15, 16 ) ;
}
/* スクロール・バーを表示する */
static void dsp_bar( int num )
{
auto int sz, ps ;
auto int x = BAR_X ;
auto int y = BAR_Y ;
static char *vol_ptn = NULL ;
if( maxnum == 0 )
{
sz = BAR_SIZ ;
vol_size = ps = 0 ;
}
else
{
if( ( sz = BAR_SIZ * MAX_DSP / maxnum ) > BAR_SIZ )
sz = BAR_SIZ ;
vol_size = ( BAR_SIZ - sz ) ;
ps = BAR_SIZ * num / maxnum ;
}
if( vol_ptn == NULL )
{
dsp_box( x, y, x+19, y+BAR_SIZ+5, 0,0,15 ) ;
dsp_box( x+7, y+3, x+12, y+BAR_SIZ+2, 0,0,8 ) ;
if( ( vol_ptn = (char *)malloc( 20*(BAR_SIZ+7)+16) ) != NULL )
{
DWORD(vol_ptn+0) = (int)vol_ptn + 16 ;
WORD(vol_ptn+4) = getds() ;
WORD(vol_ptn+6) = x ;
WORD(vol_ptn+8) = y ;
WORD(vol_ptn+10) = x+19 ;
WORD(vol_ptn+12) = y+BAR_SIZ+5 ;
EGB_getBlock( egbwork, vol_ptn ) ;
}
}
else
EGB_putBlock( egbwork, 0, vol_ptn ) ;
dsp_box( x+3, y+ps+3, x+16, y+ps+sz+3, 0,0,15 ) ;
}
/* スクロール・バーのクリップ */
static void MOVE_clip( REGS EVENT *ep, int x, int y, int sw )
{
x = x, sw = sw ; /* 意味なし。ワーニングを避けるため */
switch( ep->now )
{
case EVT_ON_MOS:
mos_ptn( 1 ) ;
break ;
case EVT_CLIP_MOS:
mos_ptn( 1 ) ;
MOS_horizon( ep->x1+9, ep->x1+11 ) ;
MOS_vertical( ep->y1, ep->y2 ) ;
ep->now = EVT_REP_MOS ;
case EVT_REP_MOS:
if( vol_size > 0 )
dsp_scrn( ( y - ep->y1 ) * maxnum / BAR_SIZ, FALSE ) ;
click_text( curlin ) ;
break ;
case EVT_DOLACK_MOS:
ep->now = EVT_NON ;
case EVT_OFF_MOS:
case EVT_MOVE_MOS:
case EVT_SELECT_MOS:
mos_ptn( 0 ) ;
MOS_horizon( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
break ;
}
}
static void TEXT_clip( REGS EVENT *ep, int x, int y, int sw )
{
sw = sw, y = y ; /* 意味なし ワーニング回避 */
switch( ep->now )
{
case EVT_ON_MOS: /* ボタンの上にいるときは、カーソルを変更 */
case EVT_CLIP_MOS:
mos_ptn( 6 ) ;
break ;
case EVT_DOLACK_MOS: /* 外れたら戻す */
ep->now = EVT_NON ;
case EVT_MOVE_MOS:
case EVT_OFF_MOS:
mos_ptn( 0 ) ;
break ;
case EVT_SELECT_MOS: /* その場で離すと、その位置へ移動 */
menu_event = ep->no ;
curpos = ( x - ep->x1 ) / 8 ;
mos_ptn( 6 ) ;
break ;
}
}
/* アイテムのクリック */
static void ITEM_clip( REGS EVENT *ep, int x, int y, int sw )
{
x = x, y = y, sw = sw ; /* 意味なし。ワーニングを避けるため */
if( ( ep->no < 30 && pos+ep->no-20 >= maxnum ) ||
( ep->no >= 30 && pos+(ep->no-30)/2 >= maxnum ) )
{
ep->now = EVT_NON ;
return ;
}
switch( ep->now )
{
case EVT_ON_MOS:
mos_ptn( 6 ) ;
break ;
case EVT_SELECT_MOS:
menu_event = ep->no ;
DSP_clip_off( ep ) ;
MOS_disp( MOS_OFF ) ;
if( ep->no >= 20 && ep->no < 30 )
box2( ep->x1,ep->y1, ep->x2,ep->y2, 15,15 ) ;
curpos = ( x - ep->x1 ) / 8 ;
MOS_disp( MOS_ON ) ;
mos_ptn( 6 ) ;
break ;
case EVT_OFF_MOS:
mos_ptn( 0 ) ;
break ;
case EVT_CLIP_MOS:
mos_ptn( 6 ) ;
DSP_clip_on( ep ) ;
break ;
case EVT_DOLACK_MOS:
ep->now = EVT_NON ;
case EVT_MOVE_MOS:
DSP_clip_off( ep ) ;
MOS_disp( MOS_OFF ) ;
if( ep->no >= 20 && ep->no < 30 )
box2( ep->x1,ep->y1, ep->x2,ep->y2, 15,15 ) ;
MOS_disp( MOS_ON ) ;
mos_ptn( 0 ) ;
break ;
case EVT_DLSEL_MOS:
break ;
}
}
static void MENU_clip( REGS EVENT *ep, int x, int y, int sw )
{
#define TICK_LIMIT 2000
static int tick = 0 ;
auto int now ;
x = x, y = y, sw = sw ; /* 意味なし。ワーニングを避けるため */
now = ep->now ;
switch( now )
{
case EVT_ON_MOS:
mos_ptn( 1 ) ;
break ;
case EVT_OFF_MOS:
mos_ptn( 0 ) ;
break ;
case EVT_CLIP_MOS:
mos_ptn( 1 ) ;
DSP_clip_on( ep ) ;
if( ep->rep != FALSE )
ep->now = EVT_REP_MOS ;
tick = 0 ;
break ;
case EVT_REP_MOS:
if( ++tick > TICK_LIMIT )
{
menu_event = ep->no ;
tick = 0 ;
}
break ;
case EVT_DOLACK_MOS:
ep->now = EVT_NON ;
case EVT_MOVE_MOS:
DSP_clip_off( ep ) ;
mos_ptn( 0 ) ;
break ;
case EVT_SELECT_MOS:
menu_event = ep->no ;
DSP_clip_off( ep ) ;
mos_ptn( 0 ) ;
break ;
}
}
void click_cancel( void )
{
cancel_on = TRUE ;
}
static void ROLL_clip( REGS EVENT *ep, int x, int y, int sw )
{
int tx = x, ty = y ;
int lx = mprm.xpos, ly = mprm.ypos ;
switch( ep->now )
{
case EVT_ON_MOS:
mos_ptn( 1 ) ;
break ;
case EVT_CLIP_MOS:
mos_ptn( 3 ) ;
MOS_horizon ( x-mprm.xpos+1, 639-((mprm.xpos+mprm.xsiz)-x) ) ;
MOS_vertical( y-mprm.ypos+1, 459-((mprm.ypos+mprm.ysiz)-y) ) ;
do {
lx += x - tx ; ly += y - ty ;
box( lx,ly, lx+mprm.xsiz,ly+mprm.ysiz, 15,-1,MODE_XOR ) ;
tx = x ; ty = y ;
MOS_disp( MOS_ON ) ;
do {
MOS_PAD_rdpos( &sw, &x, &y ) ;
} while( ( sw & 1 ) != 0 && x == tx && y == ty ) ;
MOS_disp( MOS_OFF ) ;
box( lx,ly, lx+mprm.xsiz,ly+mprm.ysiz, 15,-1,MODE_XOR ) ;
} while( ( sw & 1 ) != 0 ) ;
if( lx != mprm.xpos || ly != mprm.ypos )
{
MOS_disp( MOS_OFF ) ;
mprm.xpos = lx ; mprm.ypos = ly ;
mprm.func() ;
}
MOS_horizon ( mprm.xpos, mprm.xpos+mprm.xsiz ) ;
MOS_vertical( mprm.ypos, mprm.ypos+mprm.ysiz ) ;
menu_event = 999 ;
ep->now = EVT_SELECT_MOS ;
MOS_disp( MOS_ON ) ;
break ;
case EVT_DOLACK_MOS:
ep->now = EVT_NON ;
case EVT_MOVE_MOS:
case EVT_OFF_MOS:
mos_ptn( 0 ) ;
break ;
case EVT_SELECT_MOS:
mos_ptn( 0 ) ;
menu_event = 999 ;
break ;
}
}
/* アイコンの一覧が表示され、どれかを選択する */
static int DSP_select_icon( void )
{
auto int i, x,y ;
auto int xpos,ypos, xend,yend ;
auto int ttlx, ttly ;
auto int btnx, btny ;
static int already_get = -1 ;
static char *ptn = NULL ;
if( ptn == NULL )
{
if( ( ptn = (char *)
malloc( (mprm.xsiz+31) * (mprm.ysiz+16) * 4 / 8 ) ) == NULL )
return -1 ;
EGB_resolutionRam( egbwork, 0x80, 4,
( mprm.xsiz + 31 ) / 32 * 32, mprm.ysiz+2, ptn ) ;
}
if( load_count != already_get || already_get == -1 )
{
cls( 0x80, 0 ) ;
xpos = ypos = 0 ;
xend = mprm.xsiz ;
yend = mprm.ysiz ;
ttlx = mprm.ttlx ; ttly = ypos + 8 ;
btnx = mprm.btnx[0] ; btny = yend - 24 ;
dsp_box( 0,0, xend,yend, 15,15,15 ) ; /* 全体 */
dsp_box( 2,2, xend-2,30, 7,8,15 ) ; /* タイトル */
dsp_box( 2,32, xend-2,78, 7,8,15 ) ; /* テキスト */
dsp_box( 2,80, xend-2,yend-32, 7,8,15 ) ; /* パレット */
dsp_box( 2,yend-30, xend-2,yend-2, 7,8,15 ) ; /* 取消 */
dsp_box( ttlx-4,ttly-4, ttlx+132,ttly+20, 7,8,5 ) ;
dsp_box( xpos+8,ypos+34, xend-8,ypos+54, 7,8,5 ) ;
dsp_box( xpos+8,ypos+56, xend-8,ypos+76, 7,8,5 ) ;
dsp_box( btnx-2,btny-4, btnx+66,btny+20, 7,8,5 ) ;
for( i = 0 ; i < 128 ; i ++ )
{
x = 8 + ( i % 8 ) * 34 + ( i / 64 ) * 280 ;
y = 34 + ( ( i / 8 ) % 8 ) * 34 + 48 ;
box2( x,y, x+32,y+32, 15,0 ) ;
dsp_ptn( x,y, (char *)&icon[ i ], 1 ) ;
}
already_get = load_count ;
}
cls( 1, 0 ) ; /* 物理VRAMに切り換え */
xpos = mprm.xpos ;
ypos = mprm.ypos ;
xend = xpos + mprm.xsiz ;
yend = ypos + mprm.ysiz ;
ttlx = xpos + mprm.ttlx ; ttly = ypos + 8 ;
btnx = xpos + mprm.btnx[0] ; btny = yend - 24 ;
getputBlock( xpos,ypos, xend,yend, ptn, FALSE ) ;
wrt( " アイコン選択", writepage, ttlx,ttly, COL_14,COL_5, 16 ) ;
wrt( " 中 止 ", writepage, btnx,btny, COL_14,COL_5, 16 ) ;
wrt( mprm.msg[0], writepage, xpos+12,ypos+37, COL_1,COL_5, 16 ) ;
wrt( mprm.msg[1], writepage, xpos+12,ypos+59, COL_1,COL_5, 16 ) ;
EVT_level_free( 5 ) ;
for( i = 0 ; i < 128 ; i ++ )
{
x = xpos + 8 + ( i % 8 ) * 34 + (i / 64 )*280 ;
y = ypos + 34 + ( ( i / 8 ) % 8 ) * 34 + 48 ;
EVT_set_node( x,y, x+32,y+32, 5,MENU_clip, i+50, FALSE ) ;
}
EVT_set_node( btnx-2,btny-4, btnx+66,btny+20, 5,MENU_clip,1,FALSE ) ;
EVT_set_node( ttlx-4,ttly-4, ttlx+132,ttly+20, 5,ROLL_clip,5,FALSE ) ;
EVT_set_cancel( 5, click_cancel ) ;
EVT_control_cancel( TRUE ) ;
MOS_horizon ( xpos, xend ) ;
MOS_vertical( ypos, yend ) ;
KAN_dispMode() ; /* モード再表示 */
mos_ptn( 0 ) ;
return 0 ;
}
int select_icon( u_char *icon_name, u_char *icon_cmd )
{
static int menu_x = 36, menu_y = 72 ;
auto int menu = menu_event ;
auto int mos = mos_disp ;
auto int ret = -1 ;
auto int ch ;
mprm.ttlx = 220 ;
mprm.func = DSP_select_icon ;
mprm.xsiz = 604-36 ;
mprm.ysiz = 410-72+48 ;
mprm.msg[0] = (char *)icon_name ;
mprm.msg[1] = (char *)icon_cmd ;
mprm.btnx[0] = mprm.xsiz/2 - 32 ;
if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
mprm.xpos = 639 - mprm.xsiz ;
if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
mprm.ypos = 459 - mprm.ysiz ;
MOS_disp( mos_disp = MOS_OFF ) ;
if( now_palet != 1 )
chg_palette( 0, 1 ) ;
MOS_writePage( 1 ) ;
DSP_select_icon();
MOS_setpos( mprm.xpos+mprm.xsiz/2, mprm.ypos+mprm.ysiz/2 ) ;
MOS_disp( mos_disp = MOS_ON ) ;
keyflush() ;
do {
if( kbhit( OFF ) != FALSE ) /* キー入力センス */
{
if( ( ch = getch() ) == 0x1B )
{ /* ESC キーで取消 */
menu_event = 2 ; break ;
}
}
menu_event = 0 ;
EVT_loop( 5,5 ) ;
} while( ( menu_event == 0 || menu_event == 999 ) && cancel_on == FALSE ) ;
if( menu_event >= 50 && cancel_on == FALSE )
ret = menu_event - 50 ;
cancel_on = FALSE ;
MOS_disp( mos_disp = MOS_OFF ) ;
EVT_level_free( 5 ) ;
menu_event = menu ;
menu_x = mprm.xpos ;
menu_y = mprm.ypos ;
cls( 1, 0 ) ;
chg_palette( 0, now_palet ) ;
DSP_writePage( egbwork, 0 ) ;
MOS_writePage( 0 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
MOS_disp( mos_disp = mos ) ;
KAN_dispMode() ; /* モード再表示 */
return( ret ) ;
}
/* メッセージが表示され、下のボタンからどれかを選択する */
static int DSP_select_mode( void )
{
auto int i ;
auto int ttlx,ttly, ttlxsiz,ttlysiz ;
auto int xpos,ypos, btnx,btny ;
xpos = mprm.xpos ;
ypos = mprm.ypos ;
/* 設定 */
MOS_horizon ( xpos, xpos+mprm.xsiz ) ;
MOS_vertical( ypos, ypos+mprm.ysiz ) ;
mos_ptn( 0 ) ;
/* タイトルの位置と大きさ決め */
ttlx = xpos + mprm.ttlx ;
ttly = ypos + 6 ;
ttlxsiz = mprm.ttllen * 8 + 8 ;
ttlysiz = 16 + 6 ;
/* ボタンの位置と大きさ決め */
btny = ypos + mprm.ysiz - 28 ;
/* 画面作成 */
cls( 1, 0 ) ;
dsp_box( xpos, ypos, xpos+mprm.xsiz, ypos+mprm.ysiz, 5,5,5 ) ;
dsp_box( xpos+2,ypos+2, xpos+mprm.xsiz-2, ypos+mprm.ysiz-2, 7,8,5 ) ;
dsp_box( ttlx, ttly, ttlx+ttlxsiz, ttly+ttlysiz, 7,8,5 ) ;
wrt( center( mprm.ttl,mprm.ttllen ),
writepage, ttlx+4,ttly+3, COL_14,BAS_COL, 16 ) ;
for( i = 0 ; i < mprm.msgnum ; i ++ )
wrt( center( mprm.msg[i], mprm.msglen ),
writepage, xpos+4,ypos+16+24+i*20, COL_14,BAS_COL, 16 ) ;
EVT_level_free( 5 ) ;
for( i = 0 ; i < mprm.btnnum ; i ++ )
{
if( mprm.btnx[i] < 0 )
break ;
btnx = xpos + mprm.btnx[i] ;
dsp_box( btnx,btny, btnx+mprm.btnxsiz,btny+24, 15,7,4 ) ;
wrt( center( mprm.btn[i], mprm.btnlen ),
writepage, btnx+4,btny+4, COL_14,COL_4, 16 ) ;
EVT_set_node( btnx,btny, btnx+mprm.btnxsiz,btny+24,
5, MENU_clip, 1+i, FALSE ) ;
}
EVT_set_node( ttlx,ttly, ttlx+ttlxsiz,ttly+ttlysiz, 5,ROLL_clip,0, OFF ) ;
EVT_set_cancel( 5, click_cancel ) ;
EVT_control_cancel( TRUE ) ;
KAN_dispMode() ; /* モード再表示 */
return 0 ;
}
/*
* モードを選択する
*
* 戻り値
* 0~2 マウスでボタンが選択された場合
* ボタンの返す最大値 ESCキー,右クリックによる取り消し
* ボタンの返す最小値 CR,実行キーによる実行
*/
int select_mode( char *ttl, char *msg[], char *btn[] )
{
static int menu_x = 160, menu_y = 180 ;
auto int len, i, ret, ch ;
auto int menu = menu_event ;
auto int palet = now_palet ;
mprm.func = DSP_select_mode ;
/* ボタンの数と大きさ */
for( len=8, mprm.btnnum=i=0 ; i < MAX_BTN_MSG ; mprm.btnnum++, i++ )
{
if( btn[i] == NULL )
break ;
if( strlen( btn[ i ] ) > len )
len = strlen( btn[ i ] ) ;
mprm.btn[i] = btn[i] ;
}
len += ( len % 2 ) ;
mprm.btnlen = len ;
mprm.btnxsiz = len * 8 + 8 ;
/* メッセージの行数と大きさ */
for( mprm.msglen = 40, mprm.msgnum = i = 0 ; i < MAX_DSP_MSG ; i ++ )
{
if( msg[ i ] != NULL )
{
mprm.msgnum ++ ;
if( strlen( msg[ i ] ) > mprm.msglen )
mprm.msglen = strlen( msg[ i ] ) ;
}
else
break ;
mprm.msg[i] = msg[i] ;
}
mprm.msglen += ( mprm.msglen % 2 ) == 0 ? 4 : 5 ;
/* ウィンドゥの大きさと位置 */
mprm.xsiz = mprm.msglen * 8 + 8 ;
mprm.ysiz = mprm.msgnum * 20 + 32 + 24 + 24 ;
if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
mprm.xpos = 639 - mprm.xsiz ;
if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
mprm.ypos = 459 - mprm.ysiz ;
if( mprm.msgnum < 1 || mprm.btnnum < 1 )
return( FALSE ) ;
/* タイトルの大きさと位置 */
mprm.ttl = ttl ;
len = ( strlen( ttl ) > 16 ) ? strlen( ttl ) : 16 ;
mprm.ttllen = len ;
mprm.ttlx = mprm.xsiz/2 - (len*8+8) / 2 ;
/* ボタンの位置 */
switch( mprm.btnnum )
{
case 1:
mprm.btnx[0] = ( mprm.xsiz - mprm.btnxsiz ) /2 ;
break ;
case 2:
mprm.btnx[0] = mprm.xsiz/2 - mprm.btnxsiz - 4 ;
mprm.btnx[1] = mprm.xsiz/2 + 4 ;
break ;
case 3:
mprm.btnx[1] = ( mprm.xsiz - mprm.btnxsiz ) / 2 ;
mprm.btnx[0] = mprm.btnx[1] - mprm.btnxsiz - 8 ;
mprm.btnx[2] = mprm.btnx[1] + mprm.btnxsiz + 8 ;
break ;
}
/* 画面作成 */
MOS_disp( mos_disp = MOS_OFF ) ;
if( now_palet != 1 )
chg_palette( 0, now_palet = 1 ) ;
MOS_writePage( 1 ) ;
DSP_select_mode() ;
/* ループの開始 */
MOS_disp( mos_disp = MOS_ON ) ;
keyflush() ;
do {
if( kbhit( OFF ) != FALSE ) /* キー入力センス */
{
if( ( ch = getch() ) == 0x0D || ch == 0x8073 ) /* CR で実行 */
{
menu_event = 1 ; break ;
}
else if( ch == 0x1B ) /* ESC で取消 */
{
menu_event = mprm.btnnum ; break ;
}
}
menu_event = 0 ;
EVT_loop( 5,5 ) ;
} while( cancel_on != TRUE && ( menu_event == 0 || menu_event == 999 ) ) ;
MOS_disp( mos_disp = MOS_OFF ) ;
EVT_level_free( 5 ) ;
if( cancel_on != FALSE ) /* 右クリックによるキャンセル */
ret = mprm.btnnum-1, cancel_on = FALSE ;
else
ret = menu_event - 1 ;
menu_event = menu ;
menu_x = mprm.xpos ;
menu_y = mprm.ypos ;
cls( 1, 0 ) ;
DSP_writePage( egbwork, 0 ) ;
MOS_writePage( 0 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
MOS_disp( mos_disp = MOS_ON ) ;
chg_palette( 0, now_palet = palet ) ;
KAN_dispMode() ; /* モード再表示 */
return( ret ) ;
}
void assert( char *ttl, char *msg[] )
{
auto int sw, mos_x, mos_y ;
auto int sw2, mos_x2, mos_y2 ;
auto int i ;
auto int msg_num = 0, max_len = 32 ;
auto int ttlx,ttly, ttlxsiz,ttlysiz, ttl_len = 16 ;
auto int xsiz,xpos, ysiz,ypos ;
/* 文字数を数えたり、項目数を確認する */
for( i = 0 ; i < MAX_DSP_MSG ; i ++ )
if( msg[ i ] != NULL )
{
msg_num ++ ;
if( strlen( msg[ i ] ) + 4 > max_len )
max_len = strlen( msg[ i ] ) + 4 ;
}
else
break ;
if( ( ttl_len = strlen( ttl )+4 ) > max_len )
max_len = ttl_len ;
if( msg_num < 1 || msg_num > MAX_DSP_MSG )
return ;
/* 文字列の長さにゲタをはかせる */
if( max_len % 2 != 0 )
max_len ++ ;
if( ttl_len % 2 != 0 )
ttl_len ++ ;
/* 画面を暗くして、マウスカーソルを消す */
MOS_disp( mos_disp = MOS_OFF ) ;
if( now_palet != 1 )
chg_palette( 0, 1 ) ;
/* ウィンドゥの大きさと位置 */
ysiz = msg_num * 20 + 24 + 24 ;
ypos = 200 - ysiz / 2 ;
xsiz = max_len * 8 + 8 ;
xpos = 320 - xsiz / 2 ;
ttlxsiz = ttl_len * 8 + 8 ;
ttlysiz = 18 + 4 ;
ttlx = 320 - ttlxsiz / 2 ;
ttly = ypos + 8 ;
/* 画面作成 */
MOS_PAD_rdpos( &sw, &mos_x, &mos_y ) ;
MOS_writePage( 1 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
MOS_setpos( mos_x, mos_y ) ;
cls( 1, 0 ) ;
dsp_box( xpos, ypos, xpos+xsiz, ypos+ysiz, 5,5,5 ) ;
dsp_box( xpos+2,ypos+2, xpos+xsiz-2, ypos+ysiz-2, 7,8,5 ) ;
dsp_box( ttlx,ttly, ttlx+ttlxsiz,ttly+ttlysiz, 7,8,5 ) ;
wrt( center(ttl,ttl_len), writepage, ttlx+4,ttly+2, COL_14,BAS_COL, 16 ) ;
for( i = 0 ; i < msg_num ; i ++ )
wrt( center( msg[i], max_len ),
writepage, xpos+4,ypos+16+24+i*20, COL_14,BAS_COL, 16 ) ;
KAN_dispMode() ;
MOS_disp( mos_disp = MOS_ON ) ;
for( i = 0 ; i < 250000 ; i ++ ) ;
do {
MOS_PAD_rdpos( &sw2, &mos_x2, &mos_y2 ) ;
} while( kbhit( OFF ) == FALSE &&
sw == sw && mos_x == mos_x2 && mos_y == mos_y2 ) ;
keyflush() ;
MOS_disp( mos_disp = MOS_OFF ) ;
MOS_writePage( 0 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
MOS_setpos( mos_x2, mos_y2 ) ;
MOS_disp( mos_disp = MOS_ON ) ;
chg_palette( 0, now_palet ) ;
cls( 1, 0 ) ;
DSP_writePage( egbwork, 0 ) ;
}
static void DSP_edit_item_btn( char *str, int x, int y, int no )
{
int siz = strlen( str ) * 8 + 4 ;
dsp_box( x+2,y+2, x+siz+1,y+19+1, 1,1,1 ) ;
dsp_box( x,y, x+siz,y+19, 1,1,15 ) ;
wrt( str, writepage, x+3,y+2, COL_1,COL_15, 16 ) ;
EVT_set_node( x,y, x+siz,y+19, 5,MENU_clip,no, FALSE ) ;
}
int DSP_edit_item( void )
{
auto int xpos, ypos, xend, yend, x, y ;
auto int mx, my, sw, mos = mos_disp ;
xpos = mprm.xpos ;
ypos = mprm.ypos ;
xend = xpos + mprm.xsiz ;
yend = ypos + mprm.ysiz ;
/* 画面作成 */
MOS_disp( MOS_OFF ) ;
MOS_PAD_rdpos( &sw, &mx, &my ) ;
MOS_writePage( 1 ) ;
MOS_horizon ( xpos, xend ) ;
MOS_vertical( ypos, yend ) ;
DSP_writePage( egbwork, 1 ) ;
wind_close() ;
EVT_level_free( 5 ) ;
MOS_disp( MOS_OFF ) ;
EVT_set_cancel( 5, click_cancel ) ;
EVT_control_cancel( ON ) ;
cls( 1, 0 ) ;
dsp_box( xpos,ypos, xend,yend, 15,15,15 ) ;
box2( xpos+2,ypos+2, xend-2,yend-2, 0,0 ) ;
x = xpos+mprm.xsiz/2-4*16 ; y = ypos + 6 ;
dsp_box( x,y, x+8*16,y+20, 1,1,7 ) ;
wrt( "アイテム編集", writepage, x+16,y+2, COL_15,COL_7, 16 ) ;
EVT_set_node( x,y, x+8*16,y+20, 5,ROLL_clip,3, FALSE ) ;
DSP_edit_item_btn( " 取 消 ", xpos+mprm.xsiz/2+4, yend-28, 5 ) ;
DSP_edit_item_btn( " 実 行 ", xpos+mprm.xsiz/2-64-4, yend-28, 6 ) ;
x = xpos+mprm.ttlx ; y = ypos+mprm.ttly ;
dsp_ptn( x,y, (char *)&icon[ mprm.ttllen ], 1 ) ;
EVT_set_node( x,y, x+31,y+31, 5,ITEM_clip,20, FALSE ) ;
x = xpos+mprm.btnx[0] ; y = ypos+mprm.btny[0] ;
box2( x,y, x+mprm.btnlen*8+2,y+19, 1,1 ) ;
wrt( mprm.btn[0], writepage, x+2,y+2, COL_1,COL_15, 16 ) ;
EVT_set_node( x,y, x+mprm.btnlen*8+2,y+19, 5,TEXT_clip,1, FALSE ) ;
x = xpos+mprm.btnx[1] ; y = ypos+mprm.btny[1] ;
box2( x,y, x+mprm.msglen*8+2,y+19, 1,1 ) ;
wrt( mprm.btn[1], writepage, x+2,y+2, COL_1,COL_15, 16 ) ;
EVT_set_node( x,y, x+mprm.msglen*8+2,y+19, 5,TEXT_clip,2, FALSE ) ;
DSP_edit_item_btn( mprm.sw[0], xpos+mprm.swx[0], ypos+mprm.swy[0], 10 ) ;
KAN_dispMode() ; /* モード再表示 */
MOS_setpos( mx, my ) ;
MOS_disp( mos_disp = mos ) ;
return 0 ;
}
/*
* アイテム編集
* 実行/取消のどちらのボタンで終わったかによって
* 実行 : TRUE
* 取消 : FALSE
* を返す
*/
int edit_item( INF *ip ) /* 内容編集 */
{
static int menu_x = 61, menu_y = 100 ;
auto int menu = menu_event ;
auto int palet = now_palet ;
auto int mos = mos_disp ;
auto int return_value = FALSE ;
auto int ch, mx,my, icon_num ;
auto int buflen[2] ;
auto int dirmode ;
auto char buf[2][80] ;
auto MENU_PRM tmpprm ;
MOS_PAD_rdpos( &ch, &mx,&my ) ;
/* 画面を暗くして、マウスカーソルを消す */
if( now_palet != 1 )
chg_palette( 0, now_palet = 1 ) ;
MOS_disp( mos_disp = MOS_OFF ) ;
icon_num = ip->icon_num ;
strcpy( buf[0], (char *)ip->name ) ; /* アイテム名 */
strcpy( buf[1], (char *)ip->cmd ) ; /* アイテム・パラメータ */
dirmode = ip->dirflag ;
buflen[0] = 12 ;
buflen[1] = 63 ;
mprm.xsiz = 536 ;
mprm.ysiz = 170 ;
if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
mprm.xpos = 639 - mprm.xsiz ;
if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
mprm.ypos = 459 - mprm.ysiz ;
mprm.ttllen = ip->icon_num ;
mprm.ttlx = 15 ; /* アイコン表示位置 */
mprm.ttly = 30 ;
mprm.btn[0] = buf[0] ; /* アイテム名 */
mprm.btnx[0] = 15 ; /* アイテム名表示位置 */
mprm.btny[0] = 70 ;
mprm.btnlen = 12 ;
mprm.btn[1] = buf[1] ; /* アイテム・パラメータ */
mprm.btnx[1] = 15 ; /* アイテム・パラメータ表示位置 */
mprm.btny[1] = 100 ;
mprm.sw[0] = get_dirmode( dirmode ) ;
mprm.swx[0] = 460 ;
mprm.swy[0] = 70 ;
mprm.swnum = 1 ;
mprm.swlen = strlen( mprm.sw[0] ) ;
mprm.msglen = 63 ;
mprm.func = DSP_edit_item ;
maxnum ++ ; /* ひとつもアイテムが登録されてない状態で新規登録を
しようとした時、ITEM_clipルーチンのチェックに
ひっかかるため */
DSP_edit_item() ;
curlin = 0 ;
menu_event = 1 ;
MOS_disp( mos_disp = MOS_ON ) ;
keyflush() ;
while( 1 )
{
EVT_loop( 5, 5 ) ;
if( cancel_on == TRUE || menu_event == 5 || menu_event == 6 )
break ;
if( menu_event == 0 && kbhit( ON ) == FALSE )
continue ;
if( kbhit( ON ) != FALSE ) /* キー入力センス */
{
ch = getch() ;
if( ch == 0x8073 ) /* 実行キーで登録終了 */
{
putch( ch ) ;
menu_event = 6 ;
break ;
}
if( ch == 0x1B ) /* ESC で取消終了 */
{
putch( ch ) ;
menu_event = 5 ;
break ;
}
switch( ch )
{
case '\x1E': /* 上矢印 */
case '\x05': /* ^E */
if( ( -- curlin ) < 0 )
curlin = 0 ;
break ;
case '\x0D': /* リターン */
curpos = 0 ;
case '\x1F': /* 下矢印 */
case '\x18': /* ^X */
if( ( ++ curlin ) > 1 )
curlin = 1 ;
break ;
default: /* その他は行編集関数へ渡す */
putch( ch ) ;
continue ;
}
}
switch( menu_event )
{
case 1: curlin = 0 ; break ;
case 2: curlin = 1 ; break ;
case 10: /* 起動/移動 切り換え */
dirmode = chg_dirmode( dirmode ) ;
mprm.sw[0] = get_dirmode( dirmode ) ;
MOS_disp( MOS_OFF ) ;
DSP_edit_item_btn( mprm.sw[0],
mprm.xpos+mprm.swx[0], mprm.ypos+mprm.swy[0], 10 ) ;
MOS_disp( MOS_ON ) ;
break ;
case 20: /* アイコン選択 */
memcpy( &tmpprm, &mprm, sizeof( MENU_PRM ) ) ;
if( ( ch = select_icon( ip->name, ip->cmd ) ) != -1 )
icon_num = ch ;
memcpy( &mprm, &tmpprm, sizeof( MENU_PRM ) ) ;
mprm.ttllen = icon_num ;
DSP_edit_item() ;
}
wind_open(
mprm.xpos+mprm.btnx[curlin]+2,
mprm.ypos+mprm.btny[curlin]+2,
buflen[curlin],&curpos, 1,15,5, buf[curlin] ) ;
menu_event = 0 ;
}
wind_close() ;
MOS_disp( mos_disp = MOS_OFF ) ;
if( menu_event == 6 ) /* [登録]ボタンで終了 */
{
strcpy( (char *)ip->name, buf[0] ) ; /* アイテム名 */
strcpy( (char *)ip->cmd, buf[1] ) ; /* アイテム・パラメータ */
ip->icon_num = icon_num ;
ip->dirflag = dirmode ;
return_value = TRUE ;
}
cls( 1, 0 ) ;
DSP_writePage( egbwork, 0 ) ;
MOS_writePage( 0 ) ;
mos_ptn( 0 ) ;
MOS_horizon ( MIN_HORIZON, MAX_HORIZON ) ;
MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
MOS_setpos( mx, my ) ;
MOS_disp( mos_disp = mos ) ;
chg_palette( 0, now_palet = palet ) ;
menu_x = mprm.xpos ;
menu_y = mprm.ypos ;
menu_event = menu ;
maxnum -- ; /* ひとつもアイテムが登録されてない状態で新規登録を
しようとした時、ITEM_clipルーチンのチェックに
ひっかかるため */
KAN_dispMode() ; /* モード再表示 */
return return_value ;
}